
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

public class Forca {

    private static final int NUMERO_ERROS_MAX = 6;
    private String letrasInformadas = "";
    private int numeroAcertosTotal = 0;
    private int numeroErrosTotal = 0;
    private JanelaForca janelaForca;
    private char[] palavraMostra;
    String palavra = "";
    String tema = "";

    private void mostraForcaEPalavra() {
        if (janelaForca == null) {
            janelaForca = new JanelaForca();
        }
        janelaForca.mostra(numeroErrosTotal);
        JOptionPane.showMessageDialog(null, mostraLetras());
    }
    
    private String mostraLetras() {
        StringBuilder sb = new StringBuilder();
        
        for(int i = 0; i < palavraMostra.length; i++) {
            sb.append(palavraMostra[i]);
        }
        
        return sb.toString();
    }

    private void entraInformacoesIniciais() {
        try {
            palavra = Start.getServicoRemoto().getJogo().getPalavra();
            tema = Start.getServicoRemoto().getJogo().getDica();
        } catch (RemoteException ex) {
            Logger.getLogger(Forca.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private char entraComletra() {

        char retorno = ' ';
        boolean jaInformada = true;
        while (jaInformada) {
            // Jogador 2 informa letra
            retorno = JOptionPane.showInputDialog("Entre com uma letra da palavra.").charAt(0);

            // Verifica se letra jah nao foi informada
            if (letrasInformadas.indexOf(retorno) < 0) {
                letrasInformadas += retorno;
                jaInformada = false;
            }
        }
        return retorno;
    }

    private void verificaSeAcertou(char letra) {
        int numeroAcertos = verificaNumeroAcertos(letra);
        numeroAcertosTotal = numeroAcertosTotal + numeroAcertos;
        if (numeroAcertos == 0) {
            numeroErrosTotal++;
        }
    }

    public int verificaNumeroAcertos(char letra) {
        int numeroAcertos = 0;
        while (palavra.contains(letra + "")) {
            numeroAcertos++;
            int index = palavra.indexOf(letra);
            this.palavraMostra[index] = letra;
            palavra = palavra.replaceFirst(letra + "", "_");
        }
        return numeroAcertos;
    }

    private void terminaForca() {

        boolean ganhou = numeroAcertosTotal == palavra.length();

        if (ganhou) {
            JOptionPane.showMessageDialog(null,"Parabens vc venceu!");
        } else {
            JOptionPane.showMessageDialog(null,"Meus pesames vc perdeu!");
        }
        janelaForca.dispose();
    }

    private boolean verificaSeForcaTerminou() {
        boolean terminou = false;
        if ((numeroErrosTotal >= NUMERO_ERROS_MAX) || (numeroAcertosTotal == palavra.length())) {
            terminou = true;
        }
        return terminou;
    }

    public void inicia() {
        
        //Primeiro escolhe se será host ou cliente
        //Primeiro entra com as informacoes necessarias para comecar o forca
        entraInformacoesIniciais();
        
        this.palavraMostra = new char[palavra.length()];
        
        for (int i = 0; i < palavra.length(); i++) {
            this.palavraMostra[i] = '_';
        }

        //Enviar palavra e tema para adversario

        boolean terminou = false;
        while (!terminou) {

            //jogador informa a letra
            char letra = entraComletra();

            // Recebe feedback se acertou ou nao
            verificaSeAcertou(letra);

            // Mostra a forca
            mostraForcaEPalavra();

            // Verifica se forca terminou e se alguém ganhou
            terminou = verificaSeForcaTerminou();

        }

        //Mostra mensagens de final de forca e fecha a janelai
        terminaForca();

    }
}
